﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media.Animation;
using System.Xml.Linq;

namespace Seym
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private int _kombo = 0;
        private byte _seciliBuyukluk;
        private int _puan = 0;
        private Properties.Settings _ayarlar;
        private IEnumerable<SiralamaOgesi> _siralamalar;
        private ResourceDictionary _langRes;

        public int Puan
        {
            get { return _puan; }
            set { _puan = value > 0 ? value : 0; }
        }

        public MainWindow()
        {
            _ayarlar = Properties.Settings.Default;
            DilAyarla();
            InitializeComponent();

            for (byte i = 0; i < Boyut.Boyutlar.Length; i++)
            {
                Buyukluk.Items.Add(_langRes[Boyut.Boyutlar[i].Etiket]);
                ((ToggleButton)BoyutDegistirPanel.Children[2 - i]).Tag = i;

                if (_ayarlar.SeciliBoyut == i)
                    ((ToggleButton)BoyutDegistirPanel.Children[2 - i]).IsChecked = true;
            }

            _seciliBuyukluk = _ayarlar.SeciliBoyut;
            SiralamaListesi.ItemsSource = new List<SiralamaOgesi>();
            KutuTutucu.KutucukCesitSayisi = _ayarlar.RenkSayisi;
            KutuTutucu.KutucukBoyutu = _ayarlar.KutucukBoyutu;
            KutuTutucu.KutucukBosluk = _ayarlar.KutucukBosluk;

            SiralamalariYukle();
            IlkDurum();
        }

        #region Yardımcı Metodlar

        private void IlkDurum()
        {
            KutuTutucu.KutucukCesitSayisi = _ayarlar.RenkSayisi;
            KutuTutucu.Buyukluk = Boyut.Boyutlar[_seciliBuyukluk];
            KutuTutucu.GeriAlmaCezasi = _ayarlar.GeriAlmaCezasi;

            _puan = 0;
            _kombo = 0;
            ToplamPuan.Text = "0";
            SeciliKutu.Text = SeciliPuan.Text = "";
            Buyukluk.SelectedIndex = _seciliBuyukluk;

            AltPanelHazirla();
        }

        private void AltPanelHazirla()
        {
            AltBilgi.Children.Clear();

            TextBlock t;
            for (byte i = 1; i <= _ayarlar.RenkSayisi; i++)
            {
                t = new TextBlock();
                t.Width = 20;
                t.Height = 20;
                t.Background = Yardimci.TurArkaplani(i, true); // içerisinde sayılar olacağı için düz renk tercih ediyoruz
                t.VerticalAlignment = VerticalAlignment.Center;
                t.Margin = new Thickness(3);
                t.Padding = new Thickness(0, 2, 0, 2);
                t.TextAlignment = TextAlignment.Center;
                t.FontSize = 11;

                AltBilgi.Children.Add(t);
            }
            ((TextBlock)AltBilgi.Children[0]).Margin = new Thickness(12, 3, 3, 3);

            RenkSayaclariGuncelle();
        }

        private void DilAyarla()
        {
            if (_ayarlar.OyunDili == "")
            {
                string sistemDili = System.Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
                _ayarlar.OyunDili = sistemDili == "tr" ? "tr" : "en";
                _ayarlar.Save();
            }

            Resources.MergedDictionaries.Remove(_langRes);
            _langRes = new ResourceDictionary();
            _langRes.Source = new Uri(string.Format("StringResources.{0}.xaml", _ayarlar.OyunDili), UriKind.Relative);
            Resources.MergedDictionaries.Add(_langRes);
        }

        private void RenkSayaclariGuncelle()
        {
            for (byte i = 1; i <= _ayarlar.RenkSayisi; i++)
                ((TextBlock)(AltBilgi.Children[i - 1])).Text = KutuTutucu.RenkSayisi[i].ToString();
        }

        private void SiralamalariYukle()
        {
            _siralamalar = from s in Yardimci.SiralamaDosyasi.Elements("siralama")
                           where s.Attribute("boyut").Value == Buyukluk.SelectedIndex.ToString() && s.Attribute("renk").Value == _ayarlar.RenkSayisi.ToString()
                           select new SiralamaOgesi
                           {
                               Ad = s.Element("ad").Value,
                               Puan = int.Parse(s.Element("puan").Value),
                               KalanKutu = int.Parse(s.Element("kalan").Value),
                               Boyut = byte.Parse(s.Attribute("boyut").Value),
                               RenkSayisi = byte.Parse(s.Attribute("renk").Value),
                               Tarih = DateTime.Parse(s.Element("tarih").Value),
                               Kombo = int.Parse(s.Element("kombo").Value)
                           };
            RenkSayisiGoster.Text = _ayarlar.RenkSayisi.ToString();
        }

        private void SecenekleriYukle()
        {
            RenkSayisiSec.SelectedItem = _ayarlar.RenkSayisi;
            TemaSec.SelectedItem = _ayarlar.SeciliTema;
            GeriAlmaCezasi.IsChecked = _ayarlar.GeriAlmaCezasi;
            DilSec.SelectedIndex = _ayarlar.OyunDili == "tr" ? 0 : 1;
        }

        private void SiralamaPenceresi(bool ac)
        {
            if (ac)
            {
                SiralamalarPopup.IsOpen = true;
                Overlay.Visibility = Visibility.Visible;
                SiralamalariYukle();
            }
            else
            {
                SiralamalarPopup.IsOpen = false;
                Overlay.Visibility = Visibility.Hidden;
            }
        }

        private void AdSorPenceresi(bool ac)
        {
            if (ac)
            {
                AdSorPopup.IsOpen = true;
                Overlay.Visibility = Visibility.Visible;
                OyuncuAdi.Text = _ayarlar.OyuncuAdi;
                OyuncuAdi.Focus();
            }
            else
            {
                AdSorPopup.IsOpen = false;
                Overlay.Visibility = Visibility.Hidden;
            }
        }

        private void SeceneklerPenceresi(bool ac)
        {
            if (ac)
            {
                SeceneklerPopup.IsOpen = true;
                Overlay.Visibility = Visibility.Visible;
                SecenekleriYukle();
            }
            else
            {
                SeceneklerPopup.IsOpen = false;
                Overlay.Visibility = Visibility.Hidden;
            }
        }
        #endregion

        private void KutuTutucu_SecimDegisti(object sender, EventArgs e)
        {
            if (KutuTutucu.SeciliKutu == 0)
                SeciliPuan.Text = SeciliKutu.Text = "";
            else
            {
                SeciliPuan.Text = string.Format("+{0}", KutuTutucu.SeciliPuan);
                SeciliKutu.Text = string.Format("({0} {1})", KutuTutucu.SeciliKutu, _langRes["kutular"]);
            }
        }

        private void KutuTutucu_KutuSilindi(object sender, EventArgs e)
        {
            Puan += KutuTutucu.SeciliPuan;
            if (KutuTutucu.SeciliKutu > _kombo)
                _kombo = KutuTutucu.SeciliKutu;

            ToplamPuan.Text = Puan.ToString();
            RenkSayaclariGuncelle();

            if (!KutuTutucu.HamleKaldiMi) // Oyun bitti mi?
                AdSorPenceresi(true);
        }

        private void BoyutDegistir_Click(object sender, RoutedEventArgs e)
        {
            ToggleButton el = (ToggleButton)sender;

            if (el.IsChecked.Value)
            {
                _seciliBuyukluk = (byte)el.Tag;
                _ayarlar.SeciliBoyut = (byte)el.Tag;
                _ayarlar.Save();
                IlkDurum();
                //Thread t = new Thread(new ThreadStart(IlkDurum));
                //t.Start();
            }
        }

        private void Siralamalar_Click(object sender, RoutedEventArgs e)
        {
            SiralamaPenceresi(true);
            SiralamaListesi.Focus();
        }

        /*
         * Ad-Sor Popup Olay Cevaplayıcılar
         * */
        private void PuanKaydet_Click(object sender, RoutedEventArgs e)
        {
            // yeni sıralamayı kaydet
            SiralamaOgesi yeniOge = SiralamaOgesi.YeniSiralama(OyuncuAdi.Text, _seciliBuyukluk, Puan, KutuTutucu.KutuSayisi, _kombo, _ayarlar.RenkSayisi);
            _ayarlar.OyuncuAdi = OyuncuAdi.Text;
            _ayarlar.Save();

            // sıralama penceresini aç
            AdSorPenceresi(false);
            SiralamaPenceresi(true);

            // siralama penceresini hazırla
            Buyukluk.SelectedIndex = -1;
            Buyukluk.SelectedIndex = _seciliBuyukluk;
            
            // yeni oyun butonunu vurgula
            ((Storyboard)FindResource("Vurgu")).Begin();
        }

        private void SiralamaPopupKapat_Click(object sender, RoutedEventArgs e)
        {
            SiralamaPenceresi(false);
        }
        /*
         * Sıralamalar Popup Olay Cevaplayıcılar
         * */
        private void Kriterler_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (Buyukluk.SelectedIndex == -1)
                return;

            int i = 1;
            var temp = _siralamalar.Select(s => new { Sira = 0, Ad = "", Deger = 0, Tarih = DateTime.Now }).ToList();
            switch (Kriter.SelectedIndex)
            {
                case 0: // Puan
                    temp = _siralamalar
                        .OrderByDescending(s => s.Puan)
                        .Select(s => new { Sira = i++, Ad = s.Ad, Deger = s.Puan, Tarih = s.Tarih }).Take(9).ToList();
                    SiralamaKriteriBaslik.Text = (string)_langRes["Puan"];
                    break;
                case 1: // Kombo
                    temp = _siralamalar
                        .OrderByDescending(s => s.Kombo)
                        .Select(s => new { Sira = i++, Ad = s.Ad, Deger = s.Kombo, Tarih = s.Tarih }).Take(9).ToList();
                    SiralamaKriteriBaslik.Text = (string)_langRes["Kombo"];
                    break;
                case 2: // Kalan Kutu
                     temp = _siralamalar
                        .OrderBy(s => s.KalanKutu)
                        .Select(s => new { Sira = i++, Ad = s.Ad, Deger = s.KalanKutu, Tarih = s.Tarih }).Take(9).ToList();
                    SiralamaKriteriBaslik.Text = (string)_langRes["Kalan Kutu"];
                    break;
            }

            SiralamaListesi.ItemsSource = temp;
            if (temp.Count > 0)
                SiralamaListesi.SelectedIndex = temp.IndexOf(temp.OrderByDescending(s => s.Tarih).First());

            SiralamaListesi.Focus();
        }

        private void OyuncuAdi_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
                PuanKaydet_Click(null, null);
        }

        private void PropertiesCommand_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            SeceneklerPenceresi(true);
        }

        private void UndoCommand_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            int geriAlinacakPuan = KutuTutucu.HamleGeriAl();
            if (geriAlinacakPuan != 0)
            {
                Puan -= geriAlinacakPuan;
                ToplamPuan.Text = Puan.ToString();
                RenkSayaclariGuncelle();
            }
        }

        private void SiralamaTemizle_Click(object sender, RoutedEventArgs e)
        {
            File.Delete(Yardimci.SiralamaDosyasiYolu);
            SiralamaListesi.ItemsSource = null;
        }

        private void NewGameCommand_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            ((Storyboard)FindResource("Vurgu")).Stop();
            IlkDurum();
        }

        private void Vazgec_Click(object sender, RoutedEventArgs e)
        {
            SeceneklerPenceresi(false);
        }

        private void Uygula_Click(object sender, RoutedEventArgs e)
        {
            _ayarlar.SeciliTema = (string)TemaSec.SelectedItem;
            _ayarlar.RenkSayisi = (byte)RenkSayisiSec.SelectedItem;
            _ayarlar.GeriAlmaCezasi = GeriAlmaCezasi.IsChecked.Value;
            _ayarlar.OyunDili = DilSec.SelectedIndex == 0 ? "tr" : "en";
            _ayarlar.Save();

            DilAyarla();
            IlkDurum();
            SeceneklerPenceresi(false);
        }

        private void Hyperlink_Click(object sender, RoutedEventArgs e)
        {
            System.Diagnostics.Process.Start("http://www.sinanyil.com");
        }
    }
}
